Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤105) which is the total number of nodes, and a positive K (≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
1
Address Data Next
where Address is the position of the node, Data is an integer, and Next is the position of the next node.
Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
题目大致要求是做一个链表的部分反转,要求按照Address Data Next的格式进行输入,其中 Address 就是当前节点的位置,Data 是节点存储的数据,Next 是下一节点的位置。第一行输入的是链表头结点的位置以及节点的总数还有反转子链的长度 K。最后也按照Address Data Next的格式输出,但是是按照部分反转后的顺序输出。
根据题目要求搭建程序框架:
1 2 3 4 5 6
int main() { 输入链表 链表部分反转操作 输出结果链表 }
因此,大体上需要设计输入,反转,输出三个功能的函数。
① 链表的输入函数
首先观察题目的输入样例,发现数据是用Address 和 Next 来实现链表功能,因此可以用结构体数组来存储数据,实现链表功能。
1 2 3 4 5 6 7 8
#define MAXLEN 100005
structNode { int Data; // 数据 int Next; // 下一节点地址下标 }; typedefstructNodeLink; Link LinkList[MAXLEN];
按照题目要求,要按照Address Data Next 的格式输入节点数据,而第一行输入略有不同,第一行输入的是链表头结点的位置以及节点的总数还有部分翻转的计数 K。根据以上要求,设计链表的输入函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 输入函数,返回链表头结点位置下标 intReadList(Link &L) { int Head, n, k; // 起始节点的位置下标,节点总数,反转子链的长度 int address, num, next; cin >> Head >> n >> k; while(n--) { cin >> address >> num >> next; L[address].Data = num; L[address].Next = next; }
// 计数函数,统计链表有效节点,排除不在链表上的离散干扰节点的影响 intcount(Link L[], int head) { int cnt = 1; for(int i = head; L[i].Next != -1; i = L[i].Next) cnt++;
return cnt;
}
执行反转的操作关键在于将下一个结点的 Next 变为上一个节点,但是这样又会导致丢失下一个节点中原来 Next 的位置,因此需要三个指针来完成反转操作。前两个指针用来进行反转,第三个指针临时存储下一节点位置。同时由于反转子链后需要连接下一段子链,因此需要记录上一段子链最后一个节点的位置以及下一段子链第一个节点的位置。